package desmontec.aluguel

import grails.plugins.springsecurity.SpringSecurityService
import desmontec.alertas.AlertaMaquinaService
import desmontec.aluguel.AluguelMaquina
import desmontec.aluguel.dto.ConsumoMesDTO
import desmontec.aluguel.dto.DetalhesConsumoDTO;
import desmontec.sistema.SecUser
import desmontec.maquinas.Maquina

class AluguelMaquinaService {

    static transactional = true
	
	SpringSecurityService springSecurityService
	
	//fernando.alves - inicio
	AlertaMaquinaService alertaMaquinaService
	//fernando.alves - fim
	
	def consultarAlugueisAtivos(params){
		def dpgsValidas = AluguelMaquina.findAllByFlagAtivoAndUsuario("S", (SecUser) springSecurityService.getCurrentUser(), params);
		return dpgsValidas;
	}
	
	
	def consultarAlugueis() {
		return AluguelMaquina.findAllByUsuario((SecUser) springSecurityService.getCurrentUser())
	}
	
	def aluguelValido(Date fimValidade){
		Calendar meuCalendario = GregorianCalendar.getInstance()
		Date dataAtual = meuCalendario.getTime()
		return dataAtual.before(fimValidade)
	}
	
	
	def atualizaStatusAlugueis() {
		Calendar meuCalendario = GregorianCalendar.getInstance()
		Date dataAtual = meuCalendario.getTime()
		def alugueis = AluguelMaquina.findAllByFlagAtivo("S")
		for (a in alugueis){
			a.flagAtivo = aluguelValido(a.fimValidade) ? "S" : "N"
			a.save(flush:true)
			if (a.flagAtivo == "N"){
				//fernando.alves - inicio
				alertaMaquinaService.removeAlertasManutencao(a)
				//fernando.alves - fim
			}
		}
		
	}
	
	def getMaquinasDisponiveis(SecUser usuario) {
		def maquinasUsuario = Maquina.findAllByUsuario(usuario)
		def maquinasDisponiveis = new ArrayList<Maquina>();
		for (m in maquinasUsuario){
			if (AluguelMaquina.findAllByFlagAtivoAndMaquina('S',m).size == 0){
				maquinasDisponiveis.add(m)
			}
		}
		return maquinasDisponiveis
	}
	
	def agruparConsumosMes(AluguelMaquina maquina){
		List<ConsumoAluguel> listaConsumo = ConsumoAluguel.findAllByAluguel(maquina);
		Map<ConsumoMesDTO, List<ConsumoAluguel>> mapaMesConsumos = new HashMap<ConsumoMesDTO, List<ConsumoAluguel>>();
		
		if(listaConsumo != null && !listaConsumo.isEmpty()){
			for(ConsumoAluguel consumoAtual: listaConsumo){
				int mes = consumoAtual.dia.month;
				int ano = consumoAtual.dia.year;
				
				ConsumoMesDTO consumoDTO = new ConsumoMesDTO(mes, ano);
				if (mapaMesConsumos.get(consumoDTO) == null) {
					mapaMesConsumos.put(consumoDTO, (new ArrayList<ConsumoAluguel>()));
				}
				mapaMesConsumos.get(consumoDTO).add(consumoAtual);
			}
			
			Set<ConsumoMesDTO> mesConsumo = mapaMesConsumos.keySet();
			for(ConsumoMesDTO mesCosumoAtual: mesConsumo){
				List<ConsumoAluguel> consumoDias = mapaMesConsumos.get(mesCosumoAtual);
				mesCosumoAtual.setConsumoDias(new ArrayList<ConsumoAluguel>(consumoDias));
			}
			
			return (new ArrayList<ConsumoMesDTO>(mesConsumo)) ;
			
		}
		
		return new ArrayList<ConsumoMesDTO>();
	}
	
	def calcularDetalhesConsumoDias(List<ConsumoAluguel> listaConsumo) {
		DetalhesConsumoDTO detalhes = new DetalhesConsumoDTO();
		int i = 0;
		for(ConsumoAluguel consumo: listaConsumo){
			detalhes.incHoras(consumo.horasTrabalhadas);
			detalhes.incConsumoDiesel(consumo.consumoDeDiesel);
			detalhes.incConsumoOleo40(consumo.consumoDeOleo40);
			detalhes.incConsumoOleo68(consumo.consumoDeOleo68);
			detalhes.incConsumoOleo90(consumo.consumoDeOleo90);
			detalhes.incConsumoGraxas(consumo.consumoGraxas);
			detalhes.incTotalGasto (consumo.valorGasto);
			i++
		}
		detalhes.setMedias(i);
		
		return detalhes;
	}
	
	
	def calcularDetalhesConsumoMes(List<ConsumoMesDTO> listaConsumo) {
		DetalhesConsumoDTO detalhes = new DetalhesConsumoDTO();
		int i = 0;
		
		for(ConsumoMesDTO consumoMes:listaConsumo ){
			for(ConsumoAluguel consumo: consumoMes.getConsumoDias()){
				detalhes.incHoras(consumo.horasTrabalhadas);
				detalhes.incConsumoDiesel(consumo.consumoDeDiesel);
				detalhes.incConsumoOleo40(consumo.consumoDeOleo40);
				detalhes.incConsumoOleo68(consumo.consumoDeOleo68);
				detalhes.incConsumoOleo90(consumo.consumoDeOleo90);
				detalhes.incConsumoGraxas(consumo.consumoGraxas);
				detalhes.incTotalGasto (consumo.valorGasto);
				i++
			}
			detalhes.setMedias(i);
			
		}
				
		return detalhes;
	}
	
}
